Amazon IVSで配信しているライブストリーミングをMediaLiveで録画してみた
はじめに
清水です。素早く簡単にセットアップでき超低遅延なライブ配信ができるAmazon Interactive Video Service(Amazon IVS)、そのシンプルさゆえか現状ではAmazon IVS自体にライブストリーミングをアーカイブ・保存する機能はありません。 *1 それでもアーカイブしたい場合にまず思いつくのはAWS Elemental MediaLiveとの連携ではないでしょうか。MediaLiveとの連携方法の一つは、映像の打ち上げ先にMediaLiveを指定、MediaLiveの出力先をライブストリーミング用のAmazon IVSとアーカイブ用のAmazon S3とする構成です。そしてもう一つ、Amazon IVSでライブストリーミングを行いそれをMediaLiveの入力とする、そしてMediaLiveの出力でS3へのアーカイブを設定する、という方法も考えられます。後者の場合、ライブストリーミング自体はAmazon IVSで完結しており、アーカイブが必要な任意のタイミングでMediaLiveをStart/Stopしてアーカイブの開始/停止を行います。(この挙動から私は「録画」という言葉がしっくりきています。)本エントリではこの方法、Amazon IVSで配信しているライブストリーミングをMediaLiveで録画することを試したみたのでまとめてみます。 *2
構成について
まずはAmazon IVSをMediaLiveと連携させてアーカイブする構成について、(1) MediaLive→IVSの構成、(2) IVS→MediaLiveの構成をそれぞれ確認しておきます。
MediaLive→IVSの構成
MediaLive→IVSの構成では、映像の打ち上げ先にMediaLiveを指定します。MediaLiveのRTMP output機能でAmazon IVSと連携、ライブストリーミングはAmazon IVS経由で行います。また映像の打ち上げ先となるMediaLiveのアーカイブ機能を使ってAmazon S3に映像をアーカイブします。
先月行われたJAWS SONIC 2020の配信システムもMediaLive→IVSの構成でライブ配信と同時にアーカイブをしていることが紹介されています。
- [Media-JAWS] MediaServicesのご紹介と導入によってもたらされた変化 - YouTube
- オンラインイベントの配信構築〜JAWS SONIC 2020 の場合〜 - Speaker Deck
このMediaLive→IVSの構成の場合、IVSはMediaLiveの1つの出力先、AWS Elemental MediaStoreやAWS Elemental MediaPackageと同じ扱いで機能している、あくまで中心にMediaLiveがいるというイメージです。
IVS→MediaLiveの構成
続いて本エントリで扱うIVS→MediaLiveの構成です。映像の打ち上げ先はAmazon IVSでライブストリーミングもAmazon IVSで行います。IVSを使ったライブストリーミング自体はそれ単体で動作させています。そこにMediaLiveのHLS pullのInputを使ってIVSのPlayback URLからライブストリーミング映像を受け取り、MediaLiveのアーカイブ機能を使ってAmazon S3へ映像をアーカイブします。
構成の中心にAmazon IVSがいるイメージで、例えばすでにIVSでライブ配信をしている構成に影響を与えず導入が可能です。ただし、IVSに打ち上げた映像がそのまますべてアーカイブされるわけではありません。
IVSのライブストリーミングをMediaLiveで録画してみた
では実際に、Amazon IVSで配信しているライブストリーミング動画をAWS Elemental MediaLiveで録画する構成について試してみたいと思います。
Amazon IVSのリソースの作成
まずはAmazon IVSのChannelを作成します。今回はAmazon IVSのリソース作成リージョンにus-west-2(Oregon)を選択しました。マネジメントコンソールのAmazon IVSの画面、[Create channel]から進みます。今回はChannel名をivs-channelと指定、その他の項目はデフォルトでChannelを作成しました。
AWS Elemental MediaLiveのリソース作成
続いてMediaLiveのリソース作成に入ります。MediaLiveのリソース作成リージョンはap-northeast-1(Tokyo)としています。
Input
マネジメントコンソールからまずはInputを作成します。[Create input]ボタンから進み、Input nameを適切に設定します。Input typeではHLSを選択します。Channel classはSINGLE_PIPELINEとし(ここは実際の環境などに合わせる必要があるかと考えます)、Input source AのURL部分にIVSで作成したChannelのPlayback URLを入力します。
Channel
Inputが作成できたら、続いてChannelを作成します。[Create channel]ボタンから進み、適切なChannel nameを入力、IAMロールを指定します。またChannel classでSINGLE_PIPELINEを選択します。Input specificationsはデフォルトのまま進めました。(このまま作成ボタンではなく、続いてInputの設定にうつります。)
左側、Input attachemntsの横にある[Add]ボタンをからAttach inputのページにうつります。Inputとして先ほど作成したInput(ここではrecording-ivs-input)を選択、必要であればAttachment nameを編集して(今回はデフォルトのまま進めました)、[Confirm]ボタンを忘れずに押下します。(まだ[Create channelボタンは押下せず、続いてOutputの設定を行います。)
そして左側、Output groupsの横にある[Add]ボタンからAdd output groupのページに進みます。出力タイプでArchiveを選択して[Confirm]ボタンを押下します。
Archive groupの設定画面に遷移するので、各項目の設定を行います。設定の詳細については以下ブログエントリも参照ください。
Archive group destination AのURLの項目に、出力先となるS3バケットの情報を入力します。s3ssl://
ではじまり、S3バケット名
、そしてS3バケット内のパス(Key)
が続く型式です。続いてArchive settingsに適切な名称を設定、Additional settingsのRollover interval(1つのアーカイブファイルあたりの時間を指定)はデフォルトの300のままとしました。(実際は用途によって適切に設定しましょう。)Archive outputsの項目では、Name modifierで_$dt$
を指定して、日付日時情報YYYYMMDDTHHMMSSを付与するようにしました。
さらに、Output 1の詳細設定ページに進みます。左側のOutput groups配下のOutput 1: からはじまる文字列をクリックします。今回はOutput nameの変更だけしておきました。Streaming settingsの項目はデフォルトのままですが、アーカイブファイルの解像度やビットレートなど、指定する必要があればここで設定しておきます。
以上でChannelの設定は完了です。[Create channel]ボタンを押下してChannelを作成します。
IVSでライブストリーミングの開始
IVS、そしてMediaLiveのリソースの準備ができたので、いよいよライブストリーミングとその録画を行っていきます。まずはIVSでライブストリーミングを行います。手順としては通常のIVSでのライブストリーミングと変わりありません。今回はStreaming SoftwareとしてiPhone 6sでZixi ONAIRを使用しました。設定は以下としています。
Streaming Softwareで映像の打ち上げを開始、ライブストリーミングが視聴できることを確認しておきます。今回は映像の視聴確認はIVSのマネジメントコンソール上で行っています。
MediaLiveでの録画の開始と終了
IVSでライブストリーミンが視聴できていることが確認できたら、続いてMediaLiveでの録画を開始してみます。マネジメントコンソールでMediaLiveのChannel詳細画面に遷移し、[Start]ボタン押下で録画を開始します。MediaLiveのChannelのStart/Stopは即時ではなく1、2分ほど時間がかかる点に注意しましょう。
ChannelがRunnigの状態になれば、録画が開始された状態です。
ちなみに、録画開始時にIVSのマネジメントコンソールも確認していたのですが、Viewersの数が少し増えていました。マネジメントコンソールで1 Viewerという状況下で4 Viewersになったことが確認できたので、MediaLive側でIVSのPlayback URLを複数取得しているか、Adaptive Bit Rate (ABR)の関係でしょうか。IVSの視聴者数がQuotasの上限ギリギリという場合は注意しておきましょう。(先日、アカウント・リージョンあたり15,000までアップしましたが。)
録画の終了については、MediaLiveの[Stop]で行います。こちらも実際に録画が停止(MediaLiveがStop)するまで少しタイムラグがあるので注意しましょう。
S3に保存された録画ファイルの確認
録画したファイルはMediaLiveのアーカイブ機能の出力先となるS3に保存されています。
Rollover intervalで設定した秒数ごとのファイルとなること(今回はデフォルトの300秒で13分ちょっと録画したので3つのファイル)、また出力がTS型式なので再生できる環境に制限があることなどに注意しましょう。
汎用的に再生できる型式にしたい場合、以下のようにMediaConvertを使って変換する必要があります。
MediaLiveのStart/Stopで自動的に変換するまでをAWS上でシステム化することも可能です。
また、今回MediaLiveでの出力形式をArchiveとしましたが、これをHLSなどにしてすぐにHLS配信ができる形式としてS3に出力する、ということもできますね。
まとめ
Amazon Interactive Video Service(Amaozn IVS)で配信しているライブストリーミングに対し、AWS Elemental MediaLiveのHLS pull InputとArchive Output機能を使ってAmazon S3への録画を試してみました。当初はIVSのアーカイブをするならMediaLive→IVSの構成かな、と思っていたのですが、ふとIVS→MediaLiveの構成もいけるのでは?と思いついたのが本エントリのきっかけです。あまりHLS pull Inputに馴染みがなく、Amazon IVSのAdaptive Bit Rate (ABR)もあるなか、うまく映像がMediaLiveに取り込めるのかな?という不安もありましたが、ざっと短時間ながら試してみた限りは問題はなさそうでした。(実際に導入を考える場合は、録画時間も含め実際の環境で検証いただく必要はあるかと思いますが。)
MediaLive→IVSとIVS→MediaLive、2つの構成にそれぞれ双方にメリット・デメリットがあるかと思いますので、実際の目的に合わせて構成を選択する必要があるかと思います。ただIVS→MediaLiveの構成が取れることで、例えばIVSでライブストリーミングしながら、同時視聴者数について懸念があれば *3、IVSの構成はそのままに、MediaLiveからさらにAWS Elemental MediaStoreやAWS Elemental MediaPackage、そしてAmazon CloudFrontと連携させて数万以上の規模の同時視聴者数にも対応ができるかと思いました。この場合、Amazon IVSの低遅延というメリットがなくなってしまうと思いますが、これはプレミアム視聴者と通常の視聴者をわける、などでカバーができるかなぁと。いずれにせよ、構成の幅が広がるのではと思ったしだいです。
脚注
- あえて機能を限定しシンプルにしているのではないか?とも考えられます。 ↩
- というか、筆者は前者については以前も思いついていたのですが、ふと先日、後者について思いついたので試してみよう、というのが本ブログエントリのテーマです。 ↩
- Amazon IVSの最大同時視聴者数、この構成を思いついたときはアカウントで3,000(上限緩和可能)だったのですが、先日15,000までアップしました。 ↩